package study.itwill.team5.board;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import study.itwill.common.DBHandler;
import study.itwill.common.Util;

public class Comment {
   /**
    * 덧글달기 기능
    * 
    * @param member_seq
    *            회원 일련번호
    * @param Comment_seq
    *            게시판 일련번호
    * @param comment
    *            덧글
    * @return true면 성공 false면 실패
    */

   // Logger 클래스의 인스턴스를 받아온다.
   static Logger logger = Logger.getLogger(Comment.class);

   static final String TABLE = "Comment";

   public int addComment(int member_seq, String comment, int board_seq) {
      // -----------------------------------------
      // 메서드 시작
      // -----------------------------------------
      logger.debug("=============== method start >> insertComment");
      logger.debug("[PARAMS] member_seq=" + member_seq);
      logger.debug("[PARAMS] comment=" + comment);
      logger.debug("[PARAMS] board_seq=" + board_seq);

      // 리턴할 값 선언
      int seq = -1;

      // SQL 인젝션 방어
      comment = comment.replace("'", "\'");

      // 트랜젝션에 대한 판단이 잘 서지 않는다면, 무조건 하면 된다.
      DBHandler.beginTrans();

      // INSERT 처리를 위한 구현
      String sql = "INSERT INTO comment(member_seq, comment, board_seq,reg_date,edit_date) VALUES (%d, '%s', %d,'%s','%s')";

      boolean result = DBHandler.execSql(sql, member_seq, comment, board_seq,
            Util.getTime(), Util.getTime());

      // -----------------------------------------
      // 결과처리
      // -----------------------------------------
      if (result) {

         DBHandler.commit();
         seq = DBHandler.getMax(TABLE, "seq", null);
         logger.debug("처리결과 >> " + seq + "번 댓글 등록 성공");
      } else {
         DBHandler.rollback();
         logger.error("처리결과 >> 데이터 추가 실패");
      }

      logger.debug("=============== method end >> deleteComment");

      return seq;

   }

   public boolean editComment(int seq, int member_seq, String comment,
         int board_seq) {
      logger.debug("=============== method start >> updateComment");
      logger.debug("[PARAMS] seq=" + seq);
      logger.debug("[PARAMS] member_seq=" + member_seq);
      logger.debug("[PARAMS] comment=" + comment);
      logger.debug("[PARAMS] board_seq=" + board_seq);

      // SQL 인젝션 방어
      comment = comment.replace("'", "\'");

      boolean result = false;

      DBHandler.beginTrans();

      String sql = "UPDATE comment SET seq = %d, member_seq= %d, comment = '%s', board_seq= %d, edit_date='%s' WHERE seq = %d;";

      result = DBHandler.execSql(sql, seq, member_seq, comment, board_seq,
            Util.getTime());

      if (result) {
         DBHandler.commit();
         logger.debug("처리결과 >> " + seq + "번 댓글 수정성공");
      } else {
         DBHandler.rollback();
         logger.error("처리결과 >> 데이터 수정 실패 ");
      }

      logger.debug("=============== method end >> updateComment");

      return result;
   }

   public boolean deleteComment(int seq) {
      logger.debug("=============== method start >> deleteComment");
      logger.debug("[PARAMS] seq=" + seq);

      boolean result = false;

      DBHandler.beginTrans();

      String sql = "DELETE FROM Comment WHERE seq = %d";
      result = DBHandler.execSql(sql, seq);

      if (result) {
         DBHandler.commit();
         logger.debug("처리결과 >> " + seq + "번 댓글삭제 성공");
      } else {
         DBHandler.rollback();
         logger.error("처리결과 >> 데이터 삭제 실패 ");
      }

      logger.debug("=============== method end >> deleteComment");

      return result;

   }

   public CommentItem viewComment(int seq) {
      logger.debug("=============== method start >> selectComment");
      logger.debug("[PARAMS] seq=" + seq);

      CommentItem item = null;

      // 데이터 조회
      String sql = "SELECT comment.seq, comment, comment.reg_date, comment.edit_date, board_seq, comment.member_seq, user_name "
            + "FROM comment INNER JOIN board ON comment.board_seq = board.seq "
            + "INNER JOIN member ON comment.member_seq = member.seq "
            + "WHERE comment.seq = %d;";
      ResultSet rs = DBHandler.getResult(sql, seq);

      if (rs != null) {
         // 데이터 조회 결과 있는 경우
         try {
            rs.next();

            // 1) ResultSet의 모든 데이터를 변수로 추출
            int seq1 = rs.getInt(1);
            String comment = rs.getString(2);
            String reg_date = rs.getString(3);
            String edit_date = rs.getString(4);
            int board_seq = rs.getInt(5);
            int member_seq = rs.getInt(6);
            String user_name = rs.getString(7);
            
            // 2) 추출된 값을 객체로 구성
            item = new CommentItem(seq1, comment,
                  board_seq, reg_date, edit_date, member_seq,user_name);

         } catch (SQLException e) {
            logger.error(e);
         } finally {
            // 3) 데이터 조회에 대한 메모리 반납
            try {
               rs.close();
            } catch (SQLException e) {
            }
            rs = null;
         }
      }

      if (item == null) {
         logger.error("데이터 조회 실패");
      } else {
         logger.debug("데이터 조회 성공");
         logger.debug(item.toString());
      }

      logger.debug("=============== method end >> selectStudent");

      return item;

   }

   public ArrayList<CommentItem> listComment(int choice, String search) {
      logger.debug("=============== method start >> selectCommentList");

      ArrayList<CommentItem> list = null;

      String sql = null;

      /*
       *  덧글 검색을 위한 파라미터 정의
       *  0, null : 덧글 전체리스트 검색
       *        (전체리스트 검색은 오버로딩 정의로 숫자값 하나만을 파라미터로 받을수 있다)
       *  1, 게시글 일련번호 검색
       *  2, "내용 검색"
       *  3, "게시글 제목 검색"
       *  4, "회원 검색"
       */
      switch(choice) {
      case 0:
         sql = "SELECT comment.seq, comment, comment.reg_date, comment.edit_date, board_seq, comment.member_seq, user_name "
               + "FROM comment INNER JOIN board ON comment.board_seq = board.seq "
               + "INNER JOIN member ON comment.member_seq = member.seq WHERE board_seq =" + search + " "
					+ "ORDER BY comment.seq;";
         break;
         
      case 1:
         sql = "SELECT comment.seq, comment, comment.reg_date, comment.edit_date, board_seq, comment.member_seq, user_name "
               + "FROM comment INNER JOIN board ON comment.board_seq = board.seq "
               + "INNER JOIN member ON comment.member_seq = member.seq "
               + "WHERE board_seq =" + search + " "
               + "ORDER BY comment.seq;";
         break;
         
      case 2:
         sql = "SELECT comment.seq, comment, comment.reg_date, comment.edit_date, board_seq, comment.member_seq, user_name "
               + "FROM comment INNER JOIN board ON comment.board_seq = board.seq "
               + "INNER JOIN member ON comment.member_seq = member.seq "
               + "WHERE comment like '%%" + search + "%%' ;";
         break;
      
      case 3:
         sql = "SELECT comment.seq, comment, comment.reg_date, comment.edit_date, board_seq, comment.member_seq, user_name "
               + "FROM comment INNER JOIN board ON comment.board_seq = board.seq "
               + "INNER JOIN member ON comment.member_seq = member.seq "
               + "WHERE title like '%%" + search + "%%';";
         break;
         
      case 4:
         sql = "SELECT comment.seq, comment, comment.reg_date, comment.edit_date, board_seq, comment.member_seq, user_name "
               + "FROM comment INNER JOIN board ON comment.board_seq = board.seq "
               + "INNER JOIN member ON comment.member_seq = member.seq "
               + "WHERE user_name like '%%" + search + "%%';";
         break;
      }
      ResultSet rs = DBHandler.getResult(sql);

      if (rs != null) {
         // 데이터 조회 결과 있는 경우
         try {
            list = new ArrayList<CommentItem>();

            while (rs.next()) {


               // 1) ResultSet의 모든 데이터를 변수로 추출
               int seq1 = rs.getInt(1);
               String comment = rs.getString(2);
               String reg_date = rs.getString(3);
               String edit_date = rs.getString(4);
               int board_seq = rs.getInt(5);
               int member_seq = rs.getInt(6);
               String user_name = rs.getString(7);
               
               // 2) 추출된 값을 객체로 구성
               CommentItem item = new CommentItem(seq1, comment,
                     board_seq, reg_date, edit_date, member_seq,user_name);
                
               // 3) ArrayList에 추가
               list.add(item);
            }
         } catch (SQLException e) {
            logger.error(e);
         } finally {
            // 4) 데이터 조회에 대한 메모리 반납
            try {
               rs.close();
            } catch (SQLException e) {
            }
            rs = null;
         }
      }

      if (list == null) {
         logger.error("데이터 조회 실패");
      } else {
         logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
      }

      logger.debug("=============== method end >> selectCommentList");

      return list;
      }
   
    /**
       * 덧글 전체리스트 검색을 위한 오버로딩 정의
       * @param choice               - 0으로 파라미터를 받을시 전체리스트 조회
       * @return ArrayList<CommentItem>   - 0과 null을 오버로딩된 메서드로 반환
       */
      public ArrayList<CommentItem> listComment(int choice) {
         return listComment(choice, null);
      }
}